package com.yht.weblog.web.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yht.weblog.common.domain.dos.ArticleDO;
import com.yht.weblog.common.domain.dos.ArticleTagRelDO;
import com.yht.weblog.common.domain.dos.TagDO;
import com.yht.weblog.common.domain.mapper.ArticleMapper;
import com.yht.weblog.common.domain.mapper.ArticleTagRelMapper;
import com.yht.weblog.common.domain.mapper.TagMapper;
import com.yht.weblog.common.enums.ResponseCodeEnum;
import com.yht.weblog.common.exception.BizException;
import com.yht.weblog.common.utils.PageResponse;
import com.yht.weblog.common.utils.Response;
import com.yht.weblog.web.convert.ArticleConvert;
import com.yht.weblog.web.model.vo.tag.FindTagArticlePageListReqVO;
import com.yht.weblog.web.model.vo.tag.FindTagArticlePageListRspVO;
import com.yht.weblog.web.model.vo.tag.FindTagListRspVO;
import com.yht.weblog.web.service.TagService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author: yht
 * @date: 2024/1/12 22:42
 * @description:
 **/
@Service
@Slf4j
public class TagServiceImpl implements TagService {

    @Autowired
    private TagMapper tagMapper;

    @Autowired
    private ArticleTagRelMapper articleTagRelMapper;

    @Autowired
    private ArticleMapper articleMapper;

    /**
     * 前台获取标签列表
     *
     * @return
     */
    @Override
    public Response findTagList() {
        // 从数据库中获取标签列表
        List<TagDO> tagDOS = tagMapper.selectList(Wrappers.emptyWrapper());

        // 将获取到的标签列表转换为FindTagListRspVO对象列表
        List<FindTagListRspVO> vos = null;
        if (!CollectionUtils.isEmpty(tagDOS)) {
            vos = tagDOS.stream().map(tagDO -> FindTagListRspVO.builder()
                            .id(tagDO.getId())
                            .name(tagDO.getName())
                            .build())
                    .collect(Collectors.toList());
        }

        // 返回获取到的标签列表
        return Response.success(vos);
    }

    /**
     * 前台获取标签文章分页列表
     *
     * @param findTagArticlePageListReqVO 请求标签文章分页列表的参数对象
     * @return 分页列表的响应对象
     */
    @Override
    public Response findTagPageList(FindTagArticlePageListReqVO findTagArticlePageListReqVO) {
        Long tagId = findTagArticlePageListReqVO.getId();  // 获取标签ID
        Long current = findTagArticlePageListReqVO.getCurrent();  // 获取当前页码
        Long size = findTagArticlePageListReqVO.getSize();  // 获取每页显示数量

        TagDO tagDO = tagMapper.selectById(tagId);  // 通过标签ID查询标签信息

        if (Objects.isNull(tagDO)) {
            log.warn("==> 该标签不存在，tagId：{}", tagId);
            throw new BizException(ResponseCodeEnum.TAG_NOT_EXISTED);  // 抛出业务异常，表示标签不存在
        }

        List<ArticleTagRelDO> articleTagRelDOS = articleTagRelMapper.selectByTagId(tagId);  // 通过标签ID查询文章标签关系列表

        if (CollectionUtils.isEmpty(articleTagRelDOS)) {
            log.warn("==> 该标签下没有文章，tagId：{}", tagId);
            return PageResponse.success(null, null);  // 返回空的分页响应
        }

        List<Long> articleIds = articleTagRelDOS.stream().map(ArticleTagRelDO::getArticleId).collect(Collectors.toList());  // 获取文章ID列表

        Page<ArticleDO> articleDOPage = articleMapper.selectPageListByArticleIds(current, size, articleIds);  // 通过文章ID列表查询文章分页信息
        List<ArticleDO> articleDOS = articleDOPage.getRecords();  // 获取文章分页信息中的文章列表

        List<FindTagArticlePageListRspVO> vos = null;  // 初始化空的标签文章列表

        if(!CollectionUtils.isEmpty(articleDOS)){
            vos = articleDOS.stream()
                    .map(articleDO -> ArticleConvert.INSTANCE.convertDO2TagArticleVO(articleDO))  // 使用ArticleConvert工具类将文章DO转换为标签文章VO
                    .collect(Collectors.toList());  // 聚合标签文章VO列表
        }
        return PageResponse.success(articleDOPage, vos);  // 返回标签文章分页列表响应对象
    }

}
